package com.lord.otter.component.infrastructure.template.service;

import cn.hutool.core.collection.CollUtil;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * 查询服务模板
 * T - 查询返回结果
 * V - 主键类型
 *
 * @author lord
 * 2025/8/27 16:48
 */
public interface QueryServiceTemplate<T, V> {

    /**
     * 查询数据详情
     *
     * @param id 数据主键
     * @author lord
     * 2025/8/28 09:14
     */
    default T get(V id) {
        Set<V> ids = new HashSet<>();
        ids.add(id);
        List<T> results = get(ids);
        if (CollUtil.isEmpty(results)) {
            return null;
        }
        return results.get(0);
    }

    /**
     * 查询数据详情
     *
     * @param ids 数据主键
     * @author lord
     * 2025/8/28 09:14
     */
    default List<T> get(Set<V> ids) {
        List<T> results = getByPage(ids);
        fillInfo(results);
        return results;
    }

    /**
     * 用分页查询方法查询单条信息
     *
     * @param id 数据主键
     * @author lord
     * 2025/8/28 09:15
     */
    default T getByPage(V id) {
        Set<V> ids = new HashSet<>();
        ids.add(id);
        List<T> results = getByPage(ids);
        if (CollUtil.isEmpty(results)) {
            return null;
        }
        return results.get(0);
    }

    /**
     * 用分页查询方法查询单条信息
     *
     * @param ids 数据主键
     * @author lord
     * 2025/8/28 09:15
     */
    default List<T> getByPage(Set<V> ids) {
        throw new UnsupportedOperationException("getByPage方法未实现");
    }

    /**
     * 填充其他信息
     *
     * @param result 需要返回的 数据
     * @author lord
     * 2025/8/28 09:17
     */
    default void fillInfo(T result) {
        return;
    }

    /**
     * 填充其他信息
     *
     * @param results 需要返回的 数据
     * @author lord
     * 2025/8/28 09:17
     */
    default void fillInfo(List<T> results) {
        return;
    }
}
